Nakama Matchmaker
ゲームのマッチ、その他色々な汎用目的に使える
matchmaker は、対戦相手orマッチング相手を求めるuserの pool を保持し、
条件が合えば一緒にする。
独立したMatchmaker
ゲームプレイの大きなウェイトを占める、Realtime multiplayer engineとは
機能的に分離されている。
同期的なプレイ、非同期的なプレイどちらでも使える。
Add a user to matchmaker
マッチメイキング開始には、ユーザーが自分自身を
matchmaking pool に追加する必要がある
code: .js
const message = { matchmaker_add: {
min_count: 2,
max_count: 4,
query: "*",
string_properties: {
region: "europe"
},
numeric_properties: {
rank: 8
}
}};
var ticket = await socket.send(message);
マッチ
キャンセル
切断
するまで、プールに残る
この追加をEntryと呼ぶ
Entry
properties
query
minimum count
max count
Property
key value ペア
ユーザーを説明する情報
ランク
エリア
マッチタイプ (ルールなど)
マッチメイキングの度に異なる情報になる可能性がある。
マッチ完了後は、マッチしたユーザーに公開される。
user を マッチメーカーに登録するときに、ペイロードに含める
string_properties: {key: str}
numeric_properties: {key: num}
数値と文字列で、フィールドが違うので注意
Query
マッチしたい相手を見つける方法の定義
*ワイルドカードを使うと、条件を無視して見つける
Nakama query language
文法
+<field_name[.sub_field_name ...]>:[op]value
半角スペース区切りで複数入れる(つまり、1つのクエリ分には半角を入れられない)
code: .query
+properites.region:europe +properties.rank:>=5 +properties.rank:<=10
europe に住んでいる 5 <= rank <= 10 の人とマッチ
この情報はpropertiesにいる
Bleve syntax
go の、検索用クエリ文法ライブラリに準拠している
https://github.com/blevesearch/bleve
http://blevesearch.com/docs/Query-String-Query/
Max & Min count
マッチメイクを成立させる最大 ~ 最小のカウント (自分含む)
Min は最低でも 2 以上
Max は Min 以上
min_count = 2, max_count = 4 のとき、
2, 3, 4 人でマッチする可能性がある
(なるべく最大人数とマッチするようにサーバーは頑張る)
code: .js
const message = { matchmaker_add: {
min_count: 4,
max_count: 4,
query: "*"
}};
var ticket = await socket.send(message);
Tickets
ticket は、matchmaker_addリクエストのレスポンスとして受け取るオブジェクト
awaitで受け取る。
code: .js
const message = {
matchmaker_remove: {
ticket: ticket
}
}
socket.send(message);
matchmaker_removeリクエストのペイロードに入れると、マッチングが未完了の場合に
キャンセルできる
(= matchmaker pool から自分を取り除く)
onMatchmakerMached
マッチメイキングは即時の処理じゃないので、
結果を受け取るにはNakamaSocket.onmachmakermatchedに、コールバックを登録して
マッチが完了したときに実行する処理を登録する必要がある
code: .js
socket.onmatchmakermatched = (matched) => {
console.info("Received MatchmakerMatched message: ", matched);
console.info("Matched opponents: ", matched.users);
};
Matched Object
onmatchmakermached コールバックに渡されるオブジェクト
usersなど、マッチに関する情報
Join a match
マッチ結果情報は、Realtime match への参加に使うのが一般的
Matched オブジェクトは、サーバーが一緒に遊ぶユーザーを識別するための
トークン(match token)を含む
トークンは短命なので早く使わないと執行する
トークンは、マッチしてないユーザーが参加しようとするのを防ぐ役割もある
ゲームプレイ本体部分のロジックは Realtime multiplayer engine が担当する
code: .js
socket.onmatchmakermatched = (matched) => {
console.info("Received MatchmakerMatched message: ", matched);
const message = {
match_join: {
token: matched.token
}
};
socket.send(message);
};
socketにmatch_join: match_token を含むペイロードを送ることで、
Realtime mutiplay に参加できる。
(match_maker の領分はここまで)